import os
import pandas as pd
import re
import time


def sort_files(files):
    """
    对文件列表按照'BmsSummaryInfo', 'BmsSummaryInfo (1)', 'BmsSummaryInfo (2)'...的顺序进行排序
    """

    def extract_number(file_name):
        match = re.search(r'\((\d+)\)', file_name)
        if match:
            return int(match.group(1))
        return -1  # 没有括号数字的文件放在最前面

    files.sort(key=lambda f: extract_number(f))
    return files


def merge_sheets_to_one(writer, excel_files, folder_path):
    """
    合并多个sheet到一个新的sheet中，并按要求处理
    """
    combined_df = pd.DataFrame()  # 存储合并后的数据
    for idx, file in enumerate(excel_files):
        file_path = os.path.join(folder_path, file)
        try:
            # 读取每个Excel文件中的所有sheet
            sheets = pd.read_excel(file_path, sheet_name=None)
            for sheet_name, df in sheets.items():
                # 去重处理
                combined_df = pd.concat([combined_df, df]).drop_duplicates()

                # 打印合并信息
                print(f"成功将 {sheet_name} 合并到新sheet中")

                # 在合并下一张表前空一行
                combined_df = pd.concat([combined_df, pd.DataFrame([[]])])

                # 等待几秒钟（模拟校验数据的过程）
                time.sleep(2)

        except Exception as e:
            print(f"读取文件时出错: {file}，错误信息: {e}")

    # 将合并后的数据保存到新的sheet中
    combined_df.to_excel(writer, sheet_name="合并", index=False)
    print("所有表格已成功合并到新sheet中")


def merge_excel_sheets(folder_path, output_file):
    excel_files = [f for f in os.listdir(folder_path) if
                   f.startswith('BmsSummaryInfo') and f.endswith('.xlsx')]  # 获取所有的Excel文件
    excel_files = sort_files(excel_files)  # 对文件进行排序

    writer = pd.ExcelWriter(output_file, engine='openpyxl')  # 创建一个新的Excel文件

    # 将多个sheet合并到一个新的sheet
    merge_sheets_to_one(writer, excel_files, folder_path)

    # 保存文件
    writer.save()
    writer.close()
    print(f"最终表格已保存到 {output_file}")


if __name__ == "__main__":
    folder_path = os.path.expanduser('D:\Desktop\钉钉文件\合并数据')  # 指定存放Excel文件的桌面文件夹路径
    output_file = 'BmsSummaryInfo_合并.xlsx'  # 合并后的Excel文件名称

    # 执行合并操作
    merge_excel_sheets(folder_path, output_file)
